package multi_thread.advanced;

import sun.misc.Unsafe;

import java.time.LocalTime;
import java.util.concurrent.TimeUnit;

/**
 * @author Cheng Jun
 * Description: 练习使用 Unsafe 的 park、unpark 方法
 * park unpark 和 wait notify 很类似
 * 调用 park 的线程，线程状态是 java.lang.Thread.State#WAITING
 * @version 1.0
 * @date 2021/9/29 22:25
 */
public class UnsafeParkAndUnPark {

    public static void main(String[] args) throws Exception {
        Unsafe unsafe = UnsafeUtil.theUnsafe();
        Thread thread_0 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "调用unsafe.park " + LocalTime.now());
            // 非绝对时间时为纳秒，为什么最大设置值为2，设置大于2秒 就没有效果？？？
            // 因为 使用的 int类型，当超过int最大值就无效了，可以改成 2000L * 1_000_000
            unsafe.park(false, 2_000 * 1_000_000);
            // 绝对时间时为毫秒，这个就没有 最大时长的限制
            // unsafe.park(true, System.currentTimeMillis() + 2_000);
            System.out.println(Thread.currentThread().getName() + "完成" + LocalTime.now());
        }, "thread-0");
        thread_0.start();
        System.out.println(thread_0.getState().name());
        TimeUnit.SECONDS.sleep(1);
        unsafe.unpark(thread_0);
        System.out.println(thread_0.getState().name());
        System.out.println(thread_0.getState().name());
        System.out.println(thread_0.getState().name());
        System.out.println(thread_0.getState().name());
    }

}
